import { XYZ_PUBLIC, XYZ_PERSON } from './module/xyzData.js';
import { PLAYERINFO_CONFIG } from './config.js';
import * as utils from './utils/utils.js';

// 导入示例函数
function impot_example(){
    let XYZ;
    mc.listen('onServerStarted',function(){
        if (ll.hasExported("xyz", "getPublic")) {
            XYZ = {
                getPlayerInfo: ll.import('xyz', 'getPlayerInfo'),
                getPublic: ll.import('xyz', 'getPublic'),
                getPerson: ll.import('xyz', 'getPerson'),
                addPosPublic: ll.import('xyz', 'addPosPublic'),
                addPosPerson: ll.import('xyz', 'addPosPerson'),
                removePosPublic: ll.import('xyz', 'removePosPublic'),
                removePosPerson: ll.import('xyz', 'removePosPerson'),
                navigationStart: ll.import('xyz', 'navigationStart'),
                navigationStop: ll.import('xyz', 'navigationStop'),
                navigationHas: ll.import('xyz', 'navigationHas'),
            };
        }else{
            logger.warn('坐标记录插件(XYZ)未安装, 坐标记录功能不会启用');
        }
    });
}

export function ll_export(){

    /**
     * @description: 获取玩家信息
     * @param {string} xuid
     * @return {object|undefined}
     */    
    function getPlayerInfo(xuid){
        return PLAYERINFO_CONFIG.get('players')[xuid];
    }

    /**
     * @description: 获取所有公共坐标
     * @return {object}
     */    
    function getPublic(){
        return XYZ_PUBLIC.get();
    }

    /**
     * @description: 获取玩家的所有坐标
     * @param {string} xuid
     * @return {object}
     */    
    function getPerson(xuid){
        return XYZ_PERSON.get(xuid);
    }

    /**
     * @description: 添加公共坐标
     * @param {string} categoryName 分类名称(不存在自动创建)
     * @param {object} warp 坐标对象(name:"雪山", tpAllow:true, pos: {x,y,z,dimid})
     * @param {string} xuid 记录者xuid
     * @return {boolean} 是否添加成功
     */    
    function addPosPublic(categoryName, warp, xuid){
        return XYZ_PUBLIC.addPos(categoryName, warp, xuid);
    }

    /**
     * @description: 添加个人坐标
     * @param {string} categoryName 分类名称(不存在自动创建)
     * @param {object} warp 坐标对象(name:"雪山", tpAllow:true, pos: {x,y,z,dimid})
     * @param {*string} xuid 玩家xuid
     * @return {boolean} 是否添加成功 * @return {*}
     */    
    function addPosPerson(categoryName, warp, xuid){
        return XYZ_PERSON.addPos(categoryName, warp, xuid);
    }

    /**
     * @description: 移除公共坐标
     * @param {string} categoryName 分类名称
     * @param {string} warpName 坐标名称
     * @param {string} xuid 操作者xuid
     * @return {boolean} 是否成功移除
     */    
    function removePosPublic(categoryName, warpName, xuid){
        return XYZ_PUBLIC.removePos(categoryName, warpName, xuid);
    }

    /**
     * @description: 移除个人坐标
     * @param {string} categoryName 分类名称
     * @param {string} warpName 坐标名称
     * @param {string} xuid 玩家xuid
     * @return {boolean} 是否成功移除
     */    
    function removePosPerson(categoryName, warpName, xuid){
        return XYZ_PERSON.removePos(categoryName, warpName, xuid);
    }

    /**
     * @description: 开始导航
     * @param {Player} pl
     * @param {object} warp
     * @return {undefined}
     */      
    function navigationStart(pl, warp){
        return utils.navigation.start(pl, warp);
    }

    /**
     * @description: 终止导航
     * @param {Player} pl
     * @return {undefined}
     */    
    function navigationStop(pl){
        return utils.navigation.stop(pl);
    }

    /**
     * @description: 判断是否在导航状态
     * @param {Player} pl
     * @return {boolean}
     */    
    function navigationHas(pl){
        return utils.navigation.has(pl);
    }

    ll.exports(getPlayerInfo, 'xyz', 'getPlayerInfo');
    ll.exports(getPublic, 'xyz', 'getPublic');
    ll.exports(getPerson, 'xyz', 'getPerson');
    ll.exports(addPosPublic, 'xyz', 'addPosPublic');
    ll.exports(addPosPerson, 'xyz', 'addPosPerson');
    ll.exports(removePosPublic, 'xyz', 'removePosPublic');
    ll.exports(removePosPerson, 'xyz', 'removePosPerson');
    ll.exports(navigationStart, 'xyz', 'navigationStart');
    ll.exports(navigationStop, 'xyz', 'navigationStop');
    ll.exports(navigationHas, 'xyz', 'navigationHas');
}